# coding=utf-8

import arcpy


def create_dem_from_points(input_points, elevation_field, tin_output, dem_output, cell_size, workspace=None):
    """
    从高程点创建TIN和DEM。

    参数:
        input_points (str): 输入的高程点要素类的路径。
        elevation_field (str): 包含高程值的字段名。
        tin_output (str): 输出TIN文件的路径。
        dem_output (str): 输出DEM文件的路径。
        cell_size (float): DEM的分辨率。
        workspace (str, 可选): 工作空间路径。如果未指定，将使用当前工作空间。

    返回:
        None
    """
    # 检查3D扩展是否可用
    if arcpy.CheckExtension("3D") == "Available":
        arcpy.CheckOutExtension("3D")
    else:
        print("3D扩展不可用。")
        return

        # 设置工作空间（如果提供了）
    if workspace:
        arcpy.env.workspace = workspace
        print("点生成DEM的工作目录设置为："+workspace)

        # 检查输出文件是否已存在
    if arcpy.Exists(tin_output):
        print("TIN文件已存在：{}".format(tin_output))
        return

        # 检查高程字段是否存在
    desc = arcpy.Describe(input_points)
    if elevation_field not in [field.name for field in desc.fields]:
        print("字段 '{}' 在 '{}' 中不存在。".format(elevation_field, input_points))
        return

    try:
        # 创建TIN
        print("开始创建tin:" + tin_output)
        arcpy.ddd.CreateTin(tin_output, "GUANGZHOU2000.prj", "{} {} masspoints".format(input_points, elevation_field),
                            "constrained_delaunay")
        print("TIN创建成功" + tin_output)

        # 从TIN创建DEM
        arcpy.ddd.TinRaster(tin_output, dem_output, data_type="FLOAT", method="LINEAR",
                            sample_distance="CELLSIZE {}".format(cell_size), z_factor=1)

        print("DEM创建成功！")

    except arcpy.ExecuteError:
        # 获取错误信息
        print(arcpy.GetMessages())

    except Exception as e:
        # 获取其他类型的错误信息
        print("发生错误: {}".format(e))
    finally:
        # 确保3D扩展被释放
        arcpy.CheckInExtension("3D")
        print("3D扩展被释放")
